给 KV Cache 瘦身:MQA · GQA · MLA

原视频:给 KV Cache 瘦身:MQA · GQA · MLA UP 主:古希腊掌管代码的神 | 时长:4:12 | tag:从 Transformer 到大模型现代架构(系列 19/20) 链接:https://www.bilibili.com/video/BV1H6JQ6iE8R

一句话结论

KV cache 的大小由 KV 头的数量决定:MHA 每个 Q 头配一组 KV;MQA 把所有 Q 头并成 1 组(缓存 ÷32,快但质量打折);GQA 分组共享(主流,质量近 MHA、速度近 MQA);MLA 干脆不缓存 K/V 本身,只缓存一个低秩潜向量,用时再展开(缓存再砍九成)。四者是同一条"质量 ↔ 显存"光谱上的选型,不是公式之争——MQA/GQA 改的只是 KV 头数与共享方式,注意力公式一字未动。

面试答法

30 秒版:先算账:KV cache 每 token 的大小 = 2(K 和 V)× 层数 × KV 头数 × head_dim × 数据字节数。以 7B、32 层、32 头、head_dim 128、FP16 为例,每 token 约 512 KB,4096 上下文就是约 2.1 GB,而且随长度和并发线性涨,解码又是访存瓶颈,所以推理端先顶不住的往往是 KV cache 而不是权重。瘦身三代:MQA(2019,Shazeer)让所有 Q 头共享 1 组 KV,缓存砍到 1/32,解码读的数据少了所以快,但质量会退化;GQA(2023)分组共享——如 32 个 Q 头分 8 组、每组共享 1 组 KV,缓存砍 3/4(头更多的 70B 是砍 7/8),论文结论是质量接近 MHA、速度接近 MQA,Llama 2 70B、Llama 3 都用 8 个 KV 头,还能用约 5% 预训练算力把老 MHA 模型 uptraining 改造成 GQA;MLA(DeepSeek-V2,2024)换思路:把 K/V 联合低秩投影成一个潜向量只缓存它,官方口径 KV cache 减少 93.3%、最大生成吞吐提升 5.76 倍。选型:追吞吐/长上下文用 GQA 或 MLA,显存够且追极致质量,MHA 依然成立。

核心原理

1. 先算账:显存花在哪

MHA 里每个 Q 头都有一组专属的 K 头和 V 头。32 头就是 32 组 KV 缓存:每生成一个 token,32 组都要写一遍;解码每一步又要把历史 KV 全部读回来。解码是 memory-bound——瓶颈是"搬多少",不是"算多少",这是后面所有优化的出发点。

MHA 的 32 组 KV 与 MQA 的 32→1(视频截图,1:02)

2. 三代方案

GQA:32 个 Q 头分 8 组共享 KV(视频截图,1:40)

MLA 的潜向量构成与官方收益数据(视频截图,3:06)

3. 一条光谱

MHA(质量满分、显存最贵)→ GQA(砍 3/4 起、质量几乎不伤)→ MQA(砍到 1/32、质量打折)→ MLA(砍九成以上、质量与 MHA 持平)。显存越省,能开的批量并发越大、上下文越长。旗舰模型全部"瘦身",本质都是在用这条光谱换推理经济性。

易错点与常见追问

修订说明